import { reqAddCart, reqBatchCheckCart, reqBatchDeleteCart, reqCartList, reqCheckCart, reqDeleteCart } from "@/api"

const state = {
  cartList: []
}

const mutations = {
  SAVE_CARTLIST(state, cartList) {
    state.cartList = cartList;
  }
}

const actions = {
  // 批量删除选中商品
  async setBatchDeleteCart({ commit }, skuIdList) {
    try {
      let result = await reqBatchDeleteCart(skuIdList);
      if (result && result.code == 200) {
        return 'ok'
      } else {
        return Promise.reject('批量删除失败')
      }
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 批量修改商品选中状态
  async setBatchCheckCart({ commit }, { isChecked, skuIdList }) {
    try {
      let result = await reqBatchCheckCart(isChecked, skuIdList);
      if (result && result.code == 200) {
        return 'ok'
      } else {
        return Promise.reject('批量修改选中状态失败')
      }
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 删除商品
  async setDeleteCart({ commit }, skuId) {
    try {
      let result = await reqDeleteCart(skuId);
      if (result && result.code == 200) {
        return 'ok'
      } else {
        return Promise.reject('删除商品失败');
      }
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 修改商品选中状态
  async setCheckCart({ commit }, { skuId, isChecked }) {
    try {
      let result = await reqCheckCart(skuId, isChecked);
      if (result && result.code == 200) {
        return 'ok'
      } else {
        return Promise.reject('修改商品状态失败')
      }
    } catch (error) {
      return Promise.reject(error)
    }
  },

  // 查看购物车列表数据
  async getCartList({ commit }) {
    try {
      let result = await reqCartList();
      if (result && result.code == 200) {
        commit('SAVE_CARTLIST', result.data)
      } else {
        return Promise.reject('获取购物车列表失败') // 走到else中是请求成功,但是企业状态码不是200
      }
    } catch (error) {
      return Promise.reject('请求购物车列表失败'); // 走到 catch 中是请求失败
    }
    // 问题: 什么时候必须 return 失败的 promise ?
    // return promise的意义在于外部调用当前函数需要接收到错误的时候,才要return 失败的 promise
    // 如果外部不需要接收到错误信息的时候,那么此时这里是不需要return 失败的promise
  },
  // 添加购物车
  async addShopCart({ commit }, { skuId, skuNum }) { // 参数二是一个对象,这里只是解构了

    try {
      let result = await reqAddCart(skuId, skuNum);
      // 看返回结果,返回结果是一个null,null必要存
      // 此时调用成功接口之后,代表"添加购物车"成功了
      // 此时应该调换页面
      // 问题来了: 如何告诉  detail页面组件,接口调用成功了?
      // 只有在企业状态码是200的情况下,才要告诉外部,这里调用接口成功到了
      if (result && result.code == 200) { // 只有接口成功,状态码也成功,才能走到下一步
        return 'ok'
      } else { // 不是200证明出问题了,没有添加购物车成功
        return Promise.reject('添加购物和失败') // 后端企业状态码错误
      }
    } catch (error) {
      // 如果走当前的这个catch,证明 await reqAddCart() 一定报错了
      // 这里我们使用 catch 捕获到错误了,没有给返回值
      // 后续的代码会继续执行
      // 此时调用当前addShopCart这个函数的地方接收不到了错误信息
      console.error('错误信息store -> ', error); // 打印错误信息
      // 这里只打印错误信息,造成的问题是,外部无法得到错误信息
      // 如何能然外部得到错误信息呢?
      // retuen一个失败的promise即可
      return Promise.reject(error)  // 接口报错
    }
    // 后续逻辑
    // console.log('i love you');
  }
  // 注意的点:
  // 1. try...catch一般配合await使用
  // 2. 使用try...catch捕获错误信息的时候,看外部是否需要这个错误信息
  //        如果外部需要这个错误信息,这个错误信息需要继续往外跑
  // 3. 只有接口成功,状态码也成功,才能走到下一步
}

const getters = {}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}